package walker

import (
	"fmt"
	"path"
	"strings"
)

type videoInfo struct {
	Title string // xxxxx..need_title/
	Path  string
}

// detail
type vod struct {
	// homevideo_model.Detail
	Group *group

	Name string // 后备Name, 优先使用 json中的信息
	Dir  string

	InfoJsonPath string // -> info
	Pic          string

	VideoTitleFilter int
	VideoPaths       []*videoInfo
}

func (v *vod) FindVideos() {
	p := v.Dir                                                // path.Join(v.Group.Dir, v.Dir)
	v.VideoPaths = getAllVideoPath(p, v.VideoTitleFilter, 10) // maxDepth=10

	for i, vp := range v.VideoPaths {
		s := strings.TrimLeft(vp.Title, " 0+-=()/.,[]{}`!@#$%")
		var yes bool
		for j := 0; j < 3; j++ {
			if vp.Title, yes = strings.CutPrefix(s, fmt.Sprintf("%d", i+1)); !yes {
				// 去掉编号
				break
			}
		}

		// if !strings.HasPrefix(s, fmt.Sprintf("%d", i+1)) {
		// 	vp.Title = fmt.Sprintf("%d %s", i+1, vp.Title) // 加上编号
		// }

		// fmt.Printf("v.VideoPaths: %d, path=%v\n", i, vp.Path)
		// fmt.Printf("v.VideoPaths: %d, title=%v\n", i, vp.Title)
	}

	// 0==当前目录==单个vod
	// 1==下一层目录==vod组合
	v.InfoJsonPath = getInfoJsonPath(p, 1)
	v.Pic = getPicPath(p, 1)
	if v.Pic == "" {
		v.Pic = getPicPath_fallback(p)
	}
	// fmt.Printf("v.Pic: %v\n", v.Pic)
	// fmt.Printf("v.InfoJsonPath: %v\n", v.InfoJsonPath)
}

func getAllVideoPath(p string, filter int, depth int) (result []*videoInfo) {
	if depth < 0 {
		return
	}
	if depth > 15 {
		//限制 最大递归
		depth = 15
	}

	depth--

	fs := listDir(p)

	// 保持好顺序. 文件|文件夹  一视同仁
	for _, f := range fs {
		if f.IsDir() {
			// TODO  第n部. 之间插入 第n部的起始视频
			// // 视频name="第n部 "+f.Name()
			result = append(result, getAllVideoPath(path.Join(p, f.Name()), filter, depth)...)
			continue
		}
		if IsVideo(f.Name()) {
			videoInfo := new(videoInfo)
			videoInfo.Path = path.Join(p, f.Name())
			videoInfo.Title = titleFilterX(filter, f.Name())
			// os.Rename(videoInfo.Path, path.Join(p, videoInfo.Title))
			result = append(result, videoInfo)
		}
	}
	return result
}

func getInfoJsonPath(p string, depth int) string {
	return getFirtMathedFileInPath(p, doubanJson, depth)
}

func getPicPath(p string, depth int) string {
	return getFirtMathedFileInPath(p, picName, depth)
}

func getPicPath_fallback(p string) string {
	// return getFirtMathedFileInPath(p, picName, depth)
	f := path.Join(p, picName)
	return f
}

func getFirtMathedFileInPath(p string, file string, depth int) string {
	f := path.Join(p, file)
	if IsFile(f) {
		return f
	}
	if depth <= 0 {
		return ""
	}
	if depth > 5 {
		//限制 最大递归
		depth = 5
	}

	depth--
	ds, _ := listDir2(p)
	for _, d := range ds {
		f := getFirtMathedFileInPath(path.Join(p, d.Name()), file, depth)
		if len(f) > 0 {
			return f
		}

	}
	return ""
}
